#include<stdio.h>
#include<iostream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<list>
#include<unordered_map>
using namespace std;

//[] 是unordered_map中最重要和常用的运算符, 它可以通过key访问元素。
//如果这个key存在则返回元素的引用, 如果key不存在则添加新元素。但unordered_multimap不支持[]。
//void Show(const unordered_map<int, int>& m)
//{
//	for (auto& p : m)
//		cout << p.first << " " << p.second << endl;
//	cout << endl;
//}
//int main()
//{
//	unordered_map<int, int>m{ {1,100},{2,200},{3,300} };
//	m[1] = 10;//修改元素的值，1是关键字，10是新的值,1是key，10是value
//	m[5] = 399;//添加新的元素{5，500}
//	Show(m);
//}


//m.at(key)
//通过key获取value值.注意只有map对象能用, multimap对象不能使用该函数.
//m.clear()
//清空数据
//m.count(key)
//统计和关键字key相同的元素个数。
//m.emplace()
//插入数据
//m.emplace_hint()
//插入数据, 带位置提示
//m.empty()
//判断映射是否为空
//m.erase()
//删除元素或一个区间
//m.find(key)
//查找和val相同的第一个值
//m.equal_range(key)
//查找和val相同的关键字, 返回一对迭代器, 一个是相同值的起始位置, 另一个是相同值的结束位置.
//m.insert()
//插入数据
//m.size()
//映射元素个数
//m.swap()
//两个映射交换数据




//at成员函数  at(key) 返回的是value值
//通过指定的键值(也就是key), 查找元素的值(value)。如果键值不存在则引发异常。不能通过值(value)找关键字(key)。
//注意只有unordered_map对象能用, unordered_multimap对象不能使用该函数。
//int main()
//{
//	unordered_map<int, string>m{ {1,"zhongguo"},{2,"china"},{3,"asian"} };
//	cout << m.at(1) << endl;
//	cout << m.at(2) << endl;
//	cout << m.at(3) << endl;
//
//	m.at(3) = "jjjj";
//	cout << m.at(3) << endl;
//
//}



//count成员函数
//统计和关键字key相同的元素个数。

//template<typename T>
//void Show(const T& m)
//{
//	for (const auto& p : m)
//		cout << p.first << " " << p.second << endl;
//	cout << endl;
//}
//int main()
//{
//	unordered_map<int, string>m{ {1,"zhongguo"},{2,"china"},{3,"asian"} };
//	unordered_multimap<int, string>m2{ {2,"zhongguo"},{2,"china"},{3,"asian"} };
//	Show(m);
//	cout << m.count(2) << endl;
//	cout << m2.count(2) << endl;
//
//	m.clear();//清空所有数据
//	cout << m.count(2) << endl;
//}


//emplace 插入元素
//emplace和insert的区别:(面试的答案)
//emplace支持就地构造, 不需要构造一个临时对象, 相比insert更高效。
//emplace不支持一次添加多个元素, 而insert可以添加一个列表或者一个迭代器区间。
//总结 : 如果一次只添加一个元素emplace的效率更好, 一次添加多个元素使用insert更好。
template<typename T>
void Show(const T& m)
{
	for (const auto& x : m)
		cout << x.first << " " << x.second << endl;
	cout << endl;
}
//int main()
//{
//	unordered_map<int, string>m;
//	m.emplace(1, "shanxi");//插入的数据原地构造，不需要key value pair
//	m.insert(make_pair(5, "hainan"));//需要构造一个临时的keyvaluepair 对象
//	m.insert( {6, "henan"} );//和上面等价
//	m.insert({ { 7,"河北" },{ 8,"江苏" } });//可以插入一个列表	
//	Show(m);
//	return 0;
//}


//erase成员函数
//删除元素或一个区间。
//通过关键字删除，或者迭代器删除
//int main()
//{
//	unordered_map<int, string>m{ {1,"beijing"},{2,"shanghai"},{3,"xian"} };
//	Show(m);
//
//	m.erase(2);//通过关键字删除
//	cout << "删除2后" << endl;
//	Show(m);
//
//	m.erase(m.begin());//删除一个迭代器指向的元素
//	Show(m);
//
//	m.erase(m.begin(), m.end());//删除整个迭代器区间
//	Show(m);
//
//	return 0;
//}




//find成员函数
//查找和key相同的元素。返回找到的第一个元素迭代器, 没有找到返回尾后迭代器。

//int main()
//{
//	unordered_map<int, string>m{ {1,"beijing"},{2,"shanghai"},{3,"xian"} };
//	Show(m);
//
//	auto it = m.find(3);//只能通过关键字查找，找到返回迭代器
//	if (it != m.end())
//		cout << "查找3成功" << it->first << " " << it->second << endl;
//	
//	it = m.find(5);
//	if (it == m.end())
//		cout << "查找失败";
//
//	return 0;
//}


//map第一个成员和第二个成员的表示 或者 .first .second


